import { ExtractJwt, Strategy } from "passport-jwt";
import { PassportStrategy } from "@nestjs/passport";
import { Injectable } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";
import { ConfigEnum } from "src/enum/config.enum";

/**
 * JWT认证策略
 *
 * 继承自PassportStrategy，用于处理JWT令牌的验证
 * 在用户登录后，后续请求会携带JWT令牌，该策略负责验证令牌的有效性
 * 并从令牌中提取用户信息用于后续的授权判断
 */
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy, "jwt") {
  /**
   * 构造函数 - 初始化JWT策略配置
   * @param configService 配置服务，用于获取应用配置信息
   */
  constructor(protected configService: ConfigService) {
    super({
      // 从请求头的Authorization字段中提取Bearer令牌
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      // 不忽略令牌过期时间，过期的令牌将被拒绝
      ignoreExpiration: false,
      // JWT签名密钥，用于验证令牌的完整性和真实性
      // 使用非空断言操作符(!)确保配置中存在SECRET值
      secretOrKey: configService.get<string>(ConfigEnum.SECRET)!,
    });
  }

  /**
   * 验证JWT载荷
   *
   * 当JWT令牌通过签名验证后，会调用此方法处理令牌中的载荷数据
   * 返回的对象会被附加到请求对象上，可在后续的路由处理器中通过@Req()装饰器获取
   *
   * @param payload JWT令牌中的载荷数据
   * @returns 返回用户信息对象，包含用户ID和用户名
   */
  async validate(payload: any) {
    const userId = payload.sub;
    const username = payload.username;

    return { userId, username };
  }
}
